iT邦幫忙

0

[Golang]單向channel介紹

  • 分享至 

  • xImage
  •  

1. channel有分,單向、雙向,通常情況下,只說channel,就是指雙向channel。
那如何聲明單向通道?

var Chan = make(chan<- int, 1)

2. 在channel的宣告中,加入 <-,代表channel的方向

var sendChan = make(chan<- int, 1) //發送通道,只能發不能收
var recvChan = make(<-chan int, 1) //接收通道,只能收不能發

3. 單向通道的用途: 對其它程式碼(呼叫方)的約束
程式碼延伸知識點:
a. channel的關閉,盡量由sender端做。
b. 帶有range的for語句。for語句會不斷嘗試從 intChan 取出元素值,即使intChan被close,它還是會在取出所有剩餘的元素值後,在結束執行。
c. 帶有range的for語句。當intChan中沒有元素值,它會永遠阻塞在for的那一行。
d. 帶有range的for語句。如果當intChan的值為nil,那它會永遠阻塞在for的那一行。

package main

import (
	"fmt"
)

func main() {
  intChan := SendIntChan()
  for v := range intChan {
    fmt.Printf("The value in intChan: %d\n", v)
  }
}

//返回 <-chan int 類型的 channel
//呼叫方,只能從channel接收元素值
func SendIntChan() <-chan int {
  num := 5
  ch := make(chan int, num)
  for i := 0; i < num; i++ {
    ch <- i
  }
  close(ch)
  return ch
}

https://play.golang.org/p/a9Gw_ZJgL0b

  1. c 範例。(阻塞在for那一行)
package main

import (
	"fmt"
)

func main() {
  intChan := SendIntChan()
  for v := range intChan {
    fmt.Printf("The value in intChan: %d\n", v)
  }
}

func SendIntChan() <-chan int {
  ch := make(chan int, 5)
  return ch
}

https://play.golang.org/p/J_-OaR8UZ9X
參考來源:
郝林-Go语言核心36讲


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言